package ScalaStudy.chapter07

object Test17_CommonWordCount {
  def main(args: Array[String]): Unit = {


    //////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////  经典wordCount案例  //////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////


    val stringList: List[String] = List(
      "hello",
      "hello world",
      "hello scala",
      "hello spark from scala",
      "hello flink from scala"
    )

    println("======  第一步：对字符串按照空格进行切分，得到一个打散所有单词的列表  ======")

    val wordList1:List[Array[String]] = stringList.map(_.split(" "))  //得到一个每一个单词都是一个数组的列表，中间用空格隔开
    val wordList2:List[String] = wordList1.flatten      //将每个数组进行打散，变成一个只有字符串的列表
    println(wordList2)

    val wordList = stringList.flatMap(_.split(" "))    //上面两步一起做
    println(wordList)

    println("======  第二步：对相同的单词进行分组  ======")

    val groupMap: Map[String, List[String]] = wordList.groupBy(word => word)   //(word => word)表示把当前的字母作为键,第二个word作为列表中的元素
    println(groupMap)

    println("======  第三步：对分组之后的list取长度，得到每个单词的个数  ======")

    val countMap: Map[String, Int] = groupMap.map(kv => (kv._1, kv._2.length))   //将map中每一个kv来，然后生成一个元组，元组第一个还是map中的键，第二个是值的长度
    println(countMap)

    println("======  第四步：将map转换为list，并排序前三  ======")

    val sortList: List[(String, Int)] = countMap.toList        //转换成list
    println(sortList)

    val result: List[(String, Int)] = sortList.sortWith(_._2 > _._2)  //依据第二个元素的大小进行排序
    println(result)



  }
}
